import * as THREE from "three";
import { GLTFExporter } from "three/examples/jsm/exporters/GLTFExporter.js";

// 创建导出器实例
const gltfExporter = new GLTFExporter();

/**
 * 导出选中的模型为 GLTF 格式
 * @param {THREE.Object3D} selectedObject - 要导出的 Three.js 对象
 * @param {string} filename - 导出的文件名（不含扩展名）
 */
export function exportToGLTF(selectedObject, filename = "model") {
  if (!selectedObject) {
    console.error("没有选中的对象可导出");
    return;
  }

  // 创建一个新的场景来包含要导出的对象
  const exportScene = new THREE.Scene();

  // 克隆对象以避免修改原始场景
  const clonedObject = selectedObject.clone();
  clonedObject.position.set(0, 0, 0); // 重置位置到原点
  clonedObject.rotation.set(0, 0, 0); // 重置旋转
  clonedObject.scale.set(1, 1, 1); // 重置缩放

  exportScene.add(clonedObject);

  // 导出选项 - 设置 binary 为 false 以导出 GLTF 格式
  const options = {
    trs: false, // 导出为变换、旋转和缩放组件
    onlyVisible: true, // 只导出可见对象
    truncateDrawRange: true, // 截断绘制范围
    binary: false, // 导出为标准 GLTF 格式 (JSON + 外部资源)
    maxTextureSize: 4096, // 最大纹理尺寸
    embedImages: false, // 不嵌入图像，而是作为外部资源
    animations: [] // 如果有动画，可以在这里指定
  };

  // 导出为 GLTF
  gltfExporter.parse(
    exportScene,
    (result) => {
      // 处理导出结果
      if (result instanceof ArrayBuffer) {
        console.error("意外导出了二进制格式，预期为 GLTF JSON");
        saveArrayBuffer(result, `${filename}.glb`);
      } else {
        // 将 JSON 结果转换为字符串
        const output = JSON.stringify(result, null, 2);

        // 保存 GLTF JSON 文件
        saveString(output, `${filename}.gltf`);

        // 处理外部资源 (如纹理)
        saveExternalResources(result, filename);
      }
    },
    (error) => {
      console.error("导出 GLTF 时出错:", error);
    },
    options
  );
}

// 辅助函数：保存 ArrayBuffer 为文件
function saveArrayBuffer(buffer, filename) {
  save(new Blob([buffer], { type: "application/octet-stream" }), filename);
}

// 辅助函数：保存字符串为文件
function saveString(text, filename) {
  save(new Blob([text], { type: "application/json" }), filename);
}

// 辅助函数：保存外部资源 (如纹理)
function saveExternalResources(gltf, baseFilename) {
  // 检查是否有外部资源
  if (!gltf.buffers || gltf.buffers.length === 0) return;

  // 遍历所有缓冲区
  gltf.buffers.forEach((buffer, index) => {
    if (buffer.uri) {
      // 创建缓冲区数据的 Blob
      const bufferData = buffer.data;
      const bufferBlob = new Blob([bufferData], { type: "application/octet-stream" });

      // 保存缓冲区文件
      save(bufferBlob, `${baseFilename}_buffer${index}.bin`);
    }
  });

  // 处理纹理
  if (gltf.images) {
    gltf.images.forEach((image, index) => {
      if (image.uri) {
        // 这里需要进一步处理纹理数据
        // 简化版本：假设纹理已经在 gltf.images 中
        console.log(`纹理 ${index} 将被保存为: ${image.uri}`);
        // 实际实现中需要从 gltf.images[index].data 提取数据并保存
      }
    });
  }
}

// 辅助函数：触发文件下载
function save(blob, filename) {
  const link = document.createElement("a");
  link.href = URL.createObjectURL(blob);
  link.download = filename;
  link.click();

  // 清理
  setTimeout(() => {
    URL.revokeObjectURL(link.href);
  }, 100);
}
